package priv.sort.util;

import priv.sort.bubble.BubbleSort;
import priv.sort.bucket.BucketSort;
import priv.sort.counting.CountingSort;
import priv.sort.heap.HeapSort;
import priv.sort.insertion.InsertionSort;
import priv.sort.merge.MergeSort;
import priv.sort.quick.QuickSort;
import priv.sort.radix.RadixSort;
import priv.sort.selection.SelectionSort;
import priv.sort.shell.ShellSort;

// 排序工具类
public class SortUtil {

    // 测试数组
    private static final int[] TEST_ARRAY = {67, 21, 38, 10, 90, 30, 70, 77, 44, 58, 71, 31, 12, 68, 13};

    // 打印数组
    private static void print(SortEnum sort, int[] arr) {
        System.out.print(sort.getName());
        System.out.print(": [");
        for (int i : arr) {
            System.out.print(i + ", ");
        }
        System.out.println("\b\b]");
    }

    /**
     * 交换数组中的两个元素
     *
     * @param arr 数组
     * @param i   被交换的元素索引
     * @param j   被交换的元素索引
     */
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void sort(SortEnum sort) {
        int[] arr = TEST_ARRAY.clone();
        switch (sort) {
            case BUBBLE -> BubbleSort.sort(arr);
            case SELECTION -> SelectionSort.sort(arr);
            case INSERTION -> InsertionSort.sort(arr);
            case SHELL -> ShellSort.sort(arr);
            case MERGE -> MergeSort.sort(arr);
            case QUICK -> QuickSort.sort(arr);
            case HEAP -> HeapSort.sort(arr);
            case COUNTING -> CountingSort.sort(arr);
            case BUCKET -> BucketSort.sort(arr);
            case RADIX -> RadixSort.sort(arr);
            default -> {
                System.out.println("未知排序算法");
                return;
            }
        }
        print(sort, arr);
    }
}
